home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / ZbL!.a < prev   
Encoding:
Text File  |  2001-09-16  |  12.1 KB  |  700 lines

  1. ; Name        :    ZbL!
  2. ; Description    :    XFD external slave for Zeeball`s filetypes
  3. ; Author    :    Zbigniew `Zeeball` Trzcionkowski
  4. ; Date        :    05.07.1999
  5. ; Version    :    4
  6. ; Supports    :    InBoot exeboot        (bootblocks)
  7. ;            FileShield 1.0/1.1     (executables)
  8. ;            FileShield 1.2 or newer    (executables)
  9. ;            WBGuruRemover        (executables)
  10. ;            EasyAdverter        (texts)
  11. ;            EasyReqtool        (texts)
  12.  
  13. ; In future    :    -
  14. ; Disclaimer    :    The slave and this source are Public Domain.
  15. ; Comment    :    Sorry for absolute offsets in the source.
  16.  
  17.  
  18.     include    "AINCLUDE:IncDirs.i"
  19.     include "libraries/xfdmaster.i"
  20.  
  21.     section    ZbL!,code
  22. ZbL:
  23.     moveq    #-1,d0        ;security
  24.     rts            ;ender
  25.     dc.b    "XFDF"        ;XFDF_ID
  26.     dc.w    1,0
  27.     dc.l    0,0,InBoot
  28.  
  29.     dc.b    "$VER: ZbL filetypes 4 (05.07.99) by Zbigniew `Zeeball` Trzcionkowski",10,0
  30.  
  31.  
  32. InBootName:    dc.b    "InBoot exeboot",0
  33. OldFSName:    dc.b    "FileShield 1.0",0
  34. FSName:        dc.b    "FileShield 1.x",0
  35. WBGRName:    dc.b    "WBGuruRemover",0
  36. ERName:        dc.b    "EasyReqtool",0
  37. EAName:        dc.b    "EasyAdverter",0
  38.     even
  39. InBoot:        dc.l    OldFileShield    ;next slave
  40.         dc.w    1        ;version
  41.         dc.w    38        ;master version
  42.         dc.l    InBootName    ;name
  43.         dc.w    XFDPFF_RELOC
  44.         dc.w    0
  45.         dc.l    RecogInBoot    ;recog buffer
  46.         dc.l    ExtractInBoot    ;decrunch buffer
  47.         dc.l    0        ;recog segment
  48.         dc.l    0        ;decrunch segment
  49.         dc.w    0,0        ;slave/replace id
  50.         dc.l    1400        ;min. file length for header and data
  51.  
  52. OldFileShield:    dc.l    FileShield    ;next slave
  53.         dc.w    1        ;version
  54.         dc.w    38        ;master version
  55.         dc.l    OldFSName    ;name
  56.         dc.w    XFDPFF_RELOC
  57.         dc.w    0
  58.         dc.l    RecogOldFS    ;recog buffer
  59.         dc.l    ExtractOldFS    ;decrunch buffer
  60.         dc.l    0        ;recog segment
  61.         dc.l    0        ;decrunch segment
  62.         dc.w    0,0        ;slave/replace id
  63.         dc.l    50        ;min. file length for header and data
  64.  
  65. FileShield:    dc.l    WBGuruRemover    ;next slave
  66.         dc.w    1        ;version
  67.         dc.w    38        ;master version
  68.         dc.l    FSName        ;name
  69.         dc.w    XFDPFF_RELOC
  70.         dc.w    0
  71.         dc.l    RecogFS        ;recog buffer
  72.         dc.l    ExtractFS    ;decrunch buffer
  73.         dc.l    0        ;recog segment
  74.         dc.l    0        ;decrunch segment
  75.         dc.w    0,0        ;slave/replace id
  76.         dc.l    50        ;min. file length for header and data
  77.  
  78. WBGuruRemover:    dc.l    EasyReqtool    ;next slave
  79.         dc.w    1        ;version
  80.         dc.w    38        ;master version
  81.         dc.l    WBGRName    ;name
  82.         dc.w    XFDPFF_RELOC
  83.         dc.w    0
  84.         dc.l    RecogWBGR    ;recog buffer
  85.         dc.l    ExtractWBGR    ;decrunch buffer
  86.         dc.l    0        ;recog segment
  87.         dc.l    0        ;decrunch segment
  88.         dc.w    0,0        ;slave/replace id
  89.         dc.l    50        ;min. file length for header and data
  90.         
  91. EasyReqtool:    dc.l    EasyAdverter    ;next slave
  92.         dc.w    1        ;version
  93.         dc.w    38        ;master version
  94.         dc.l    ERName        ;name
  95.         dc.w    XFDPFF_RELOC
  96.         dc.w    0
  97.         dc.l    RecogEasyReqtool;recog buffer
  98.         dc.l    ExtractEasyReqtool;decrunch buffer
  99.         dc.l    0        ;recog segment
  100.         dc.l    0        ;decrunch segment
  101.         dc.w    0,0        ;slave/replace id
  102.         dc.l    190        ;min. file length for header and data
  103.  
  104. EasyAdverter:    dc.l    0        ;no more
  105.         dc.w    1        ;version
  106.         dc.w    38        ;master version
  107.         dc.l    EAName        ;name
  108.         dc.w    XFDPFF_RELOC
  109.         dc.w    0
  110.         dc.l    RecogEasyAdverter    ;recog buffer
  111.         dc.l    ExtractEasyAdverter    ;decrunch buffer
  112.         dc.l    0        ;recog segment
  113.         dc.l    0        ;decrunch segment
  114.         dc.w    0,0        ;slave/replace id
  115.         dc.l    190        ;min. file length for header and data
  116.  
  117.  
  118. RecogInBoot:
  119.     cmp.l    #"trac",298(a0)        ;most characteristic at start!
  120.     bne.b    .No
  121.  
  122.     cmp.l    #$08000001,128(a0)
  123.     bne.b    .No
  124.  
  125.     cmp.l    #$dff000,180(a0)
  126.     bne.b    .No
  127.  
  128.     cmp.l    #$155,28(a0)
  129.     bne.b    .No
  130.  
  131.     cmp.l    #$3f3,(a0)
  132.     bne.b    .No
  133.  
  134.     moveq    #1,d0
  135.     rts
  136. .No:
  137.     moveq    #0,d0
  138.     rts
  139.  
  140.  
  141. RecogOldFS:
  142.     moveq    #0,d0
  143. .lup:    
  144.     addq.l    #1,d0
  145.     cmp.l    #800,d0
  146.     beq.b    .No
  147.     cmp.l    #$000003e9,(a0)+    ;look for CodeHunk
  148.     bne.b    .lup
  149.     
  150.     cmp.l    #$4e754e75,12(a0)
  151.     bne.b    .No
  152.  
  153.     cmp.l    #$00000003,(a0)
  154.     bne.b    .No
  155.     
  156.     cmp.l    #$48790000,4(a0)
  157.     bne.b    .No
  158.     
  159.     cmp.l    #$00004e75,8(a0)
  160.     bne.b    .No
  161.  
  162.     cmp.l    #$000003ec,16(a0)
  163.     bne.b    .No
  164.  
  165.     tst.l    32(a0)
  166.     bne.b    .No
  167.  
  168.     moveq    #1,d0
  169.     rts
  170. .No:
  171.     moveq    #0,d0
  172.     rts
  173.  
  174.  
  175. RecogFS:
  176.     moveq    #0,d0
  177. .lup:    
  178.     addq.l    #1,d0
  179.     cmp.l    #800,d0
  180.     beq.b    .No
  181.     cmp.l    #$000003e9,(a0)+    ;look for CodeHunk
  182.     bne.b    .lup
  183.  
  184.     cmp.l    #$000003f7,16(a0)
  185.     bne.b    .No
  186.  
  187.  
  188.     cmp.l    #$00000003,(a0)
  189.     bne.b    .No
  190.     
  191.     cmp.l    #$48790000,4(a0)
  192.     bne.b    .No
  193.     
  194.     cmp.l    #$00004e75,8(a0)
  195.     bne.b    .No
  196.  
  197.     cmp.l    #$4e750000,12(a0)
  198.     bne.b    .No
  199.  
  200.     cmp.l    #$00010001,20(a0)
  201.     bne.b    .No
  202.  
  203.     cmp.l    #$00020000,24(a0)
  204.     bne.b    .No
  205.  
  206.     tst.w    28(a0)
  207.     bne.b    .No
  208.     
  209.     moveq    #1,d0
  210.     rts
  211. .No:    moveq    #0,d0
  212.     rts
  213.  
  214.  
  215. RecogWBGR:
  216.     moveq    #0,d0
  217. .lup:    
  218.     addq.l    #1,d0
  219.     cmp.l    #800,d0
  220.     beq.b    .No
  221.     cmp.l    #$000003e9,(a0)+    ;look for CodeHunk
  222.     bne.b    .lup
  223.  
  224.         cmp.l    #$12,(a0)
  225.     bne.b    .No
  226.     
  227.     cmp.l    #"ZbL!",72(a0)
  228.     bne.b    .No
  229.     
  230.     cmp.l    #$c14bc143,4(a0)
  231.     bne.b    .No
  232.  
  233.     cmp.l    #$93c94eae,12(a0)
  234.     bne.b    .No
  235.  
  236.     cmp.l    #$4eaeff7c,64(a0)
  237.     bne.b    .No
  238.  
  239.     moveq    #1,d0
  240.     rts
  241. .No:
  242.     moveq    #0,d0
  243.     rts
  244.  
  245.  
  246. RecogEasyReqtool:
  247.     cmp.l    #"open",178(a0)        ;most characteristic at start!
  248.     bne.b    .No
  249.  
  250.     cmp.l    #$3f3,(a0)
  251.     bne.b    .No
  252.  
  253.     cmp.l    #$4e7543fa,82(a0)
  254.     bne.b    .No
  255.  
  256.     cmp.l    #$00666144,86(a0)
  257.     bne.b    .No
  258.  
  259.     cmp.l    #$4e2c7800,31(a0)
  260.     bne.b    .No
  261.  
  262.     moveq    #1,d0
  263.     rts
  264. .No:
  265.     moveq    #0,d0
  266.     rts
  267.  
  268.  
  269. RecogEasyAdverter:
  270.     cmp.l    #"dos.",110(a0)        ;most characteristic at start!
  271.     bne.b    .No
  272.  
  273.     cmp.l    #$008a2409,158(a0)
  274.     bne.b    .No
  275.  
  276.     cmp.l    #$6600fffa,168(a0)
  277.     bne.b    .No
  278.  
  279.     cmp.l    #$61000012,66(a0)
  280.     bne.b    .No
  281.  
  282.     cmp.l    #$3f3,(a0)
  283.     bne.b    .No
  284.  
  285.     moveq    #1,d0
  286.     rts
  287. .No:
  288.     moveq    #0,d0
  289.     rts
  290.  
  291. ;--------------------------------------------------
  292. ExtractInBoot:
  293.     movem.l    d2-d7/a0-a6,-(sp)
  294.  
  295.     move.l    4.w,a6        ; execbase
  296.  
  297.     move.l    (a0),a1    ; xfdbi_SourceBuffer
  298.     
  299.     lea.l    372(a1),a5    ; boot offset in file
  300.  
  301.     move.l    #1024,d0    ; boot length
  302.  
  303.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  304.  
  305.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  306.  
  307.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  308.     bne.b    .CopyMem
  309.  
  310.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  311.     
  312.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  313.     
  314.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  315.     move.l    a0,-(sp)
  316.     jsr    -198(a6)    ; AllocMem
  317.     move.l    (sp)+,a0
  318.     move.l    d0,a1
  319.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  320.     beq.b    .Err
  321. .CopyMem:
  322.     clr.w    18(a0)        ; xfdbi_Error
  323.     
  324.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  325.     move.l    a5,a0
  326.     jsr    -624(a6)    ; CopyMem
  327.     
  328.     moveq    #1,d0
  329. .Err:
  330.     movem.l    (sp)+,d2-d7/a0-a6
  331.     rts
  332.     
  333. ;--------------------------------------------------
  334. ExtractOldFS:
  335.     movem.l    d2-d7/a0-a6,-(sp)
  336.     moveq    #0,d0
  337.     move.l    4.w,a6        ; execbase
  338.  
  339.     move.l    (a0),a1    ; xfdbi_SourceBuffer
  340.     move.l    4(a0),d7    ; xfdbi_SourceBufLen
  341.     bsr.b    UnLinkOldFS
  342.     
  343.     move.l    4(a0),d0    ; xfdbi_SourceBufLen
  344.     sub.l    #44,d0
  345.     
  346.     lea.l    44(a1),a5    ; offset of original file data
  347.  
  348.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  349.  
  350.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  351.  
  352.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  353.     bne.b    .CopyMem
  354.  
  355.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  356.  
  357.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  358.  
  359.     
  360.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  361.     move.l    a0,-(sp)
  362.     jsr    -198(a6)    ; AllocMem
  363.     move.l    (sp)+,a0
  364.     move.l    d0,a1
  365.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  366.     beq.b    .cant
  367. .CopyMem:
  368.     clr.w    18(a0)        ; xfdbi_Error
  369.     
  370.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  371.     move.l    a5,a0
  372.     jsr    -624(a6)    ; CopyMem
  373.  
  374.     moveq    #1,d0
  375. .cant:
  376.     movem.l    (sp)+,d2-d7/a0-a6
  377.     rts
  378.  
  379.  
  380. UnLinkOldFS:
  381. ;    a1    -    file addy
  382. ;    d7    -    file length
  383.  
  384.     movem.l    d1-a6,-(sp)
  385.     bsr.w    RemapHeader
  386.     
  387.     lea.l    4*9(a4),a5
  388.     bra.w    HunkCor
  389. ;--------------------------------------------------
  390. ExtractFS:
  391.     movem.l    d2-d7/a0-a6,-(sp)
  392.     moveq    #0,d0
  393.  
  394.     move.l    (a0),a1    ; xfdbi_SourceBuffer
  395.     move.l    4(a0),d7    ; xfdbi_SourceBufLen
  396.     bsr.b    UnLinkFS
  397.     
  398.     move.l    4(a0),d0    ; xfdbi_SourceBufLen
  399.     sub.l    #36,d0
  400.     
  401.     lea.l    36(a1),a5    ; offset of original file data
  402.  
  403.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  404.  
  405.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  406.  
  407.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  408.     bne.b    .CopyMem
  409.  
  410.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  411.  
  412.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  413.  
  414.     move.l    4.w,a6        ; execbase
  415.     
  416.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  417.     move.l    a0,-(sp)
  418.     jsr    -198(a6)    ; AllocMem
  419.     move.l    (sp)+,a0
  420.     move.l    d0,a1
  421.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  422.     beq.b    .cant
  423. .CopyMem:
  424.     clr.w    18(a0)        ; xfdbi_Error
  425.     
  426.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  427.     move.l    a5,a0
  428.     jsr    -624(a6)    ; CopyMem
  429.  
  430.     moveq    #1,d0
  431. .cant:
  432.     movem.l    (sp)+,d2-d7/a0-a6
  433.     rts
  434.     
  435. UnLinkFS:
  436. ;    a1    -    file addy
  437. ;    d7    -    file length
  438.  
  439.     movem.l    d1-a6,-(sp)
  440.     bsr.w    RemapHeader
  441.     lea.l    4*7(a4),a5
  442.     bra.w    HunkCor
  443.  
  444. ;--------------------------------------------------
  445. ExtractWBGR:
  446.     movem.l    d2-d7/a0-a6,-(sp)
  447.     moveq    #0,d0
  448.  
  449.     move.l    (a0),a1    ; xfdbi_SourceBuffer
  450.     move.l    4(a0),d7    ; xfdbi_SourceBufLen
  451.     bsr.b    UnLinkWBGR
  452.     
  453.     move.l    4(a0),d0    ; xfdbi_SourceBufLen
  454.     sub.l    #104,d0
  455.     
  456.     lea.l    104(a1),a5    ; offset of original file data
  457.  
  458.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  459.  
  460.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  461.  
  462.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  463.     bne.b    .CopyMem
  464.  
  465.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  466.  
  467.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  468.  
  469.     move.l    4.w,a6        ; execbase
  470.     
  471.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  472.     move.l    a0,-(sp)
  473.     jsr    -198(a6)    ; AllocMem
  474.     move.l    (sp)+,a0
  475.     move.l    d0,a1
  476.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  477.     beq.b    .cant
  478. .CopyMem:
  479.     clr.w    18(a0)        ; xfdbi_Error
  480.     
  481.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  482.     move.l    a5,a0
  483.     jsr    -624(a6)    ; CopyMem
  484.  
  485.     moveq    #1,d0
  486. .cant:
  487.     movem.l    (sp)+,d2-d7/a0-a6
  488.     rts
  489.     
  490. UnLinkWBGR:
  491. ;    a1    -    file addy
  492. ;    d7    -    file length
  493.  
  494.     movem.l    d1-a6,-(sp)
  495.     bsr.w    RemapHeader
  496.     lea.l    4*24(a4),a5
  497.     bra.w    HunkCor
  498. ;--------------------------------------------------
  499. ExtractEasyReqtool:
  500.     movem.l    d2-d7/a0-a6,-(sp)
  501.  
  502.     move.l    4.w,a6        ; execbase
  503.  
  504.     move.l    (a0),a1    ; xfdbi_SourceBuffer
  505.     
  506.     lea.l    272(a1),a5    ; text offset in file
  507.     moveq    #-1,d0
  508. .loop:
  509.     addq.l    #1,d0        ;calculate text length
  510.     tst.b    (a5)+
  511.     bne.b    .loop
  512.     
  513.     lea.l    272(a1),a5    ; text offset in file
  514.  
  515.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  516.  
  517.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  518.  
  519.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  520.     bne.b    .CopyMem
  521.  
  522.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  523.     
  524.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  525.  
  526.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  527.     move.l    a0,-(sp)
  528.     jsr    -198(a6)    ; AllocMem
  529.     move.l    (sp)+,a0
  530.     move.l    d0,a1
  531.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  532.     beq.b    .Err
  533. .CopyMem:
  534.     clr.w    18(a0)        ; xfdbi_Error
  535.     
  536.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  537.     move.l    a5,a0
  538.     jsr    -624(a6)    ; CopyMem
  539.     
  540.     moveq    #1,d0    
  541. .Err:
  542.     movem.l    (sp)+,d2-d7/a0-a6
  543.     rts
  544. ;--------------------------------------------------
  545. ExtractEasyAdverter:
  546.     movem.l    d2-d7/a0-a6,-(sp)
  547.     move.l    4.w,a6        ; execbase
  548.  
  549.     move.l    (a0),a1    ; xfdbi_SourceBuffer
  550.     
  551.     lea.l    296(a1),a5    ; text offset in file
  552.     moveq    #-1,d0
  553. .loop:
  554.     addq.l    #1,d0        ;calculate text length
  555.     tst.b    (a5)+
  556.     bne.b    .loop
  557.     
  558.     lea.l    296(a1),a5    ; text offset in file
  559.  
  560.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  561.  
  562.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  563.  
  564.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  565.     bne.b    .CopyMem
  566.  
  567.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  568.     
  569.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  570.  
  571.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  572.     move.l    a0,-(sp)
  573.     jsr    -198(a6)    ; AllocMem
  574.     move.l    (sp)+,a0
  575.     move.l    d0,a1
  576.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  577.     beq.b    .Err
  578. .CopyMem:
  579.     clr.w    18(a0)        ; xfdbi_Error
  580.     
  581.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  582.     move.l    a5,a0
  583.     jsr    -624(a6)    ; CopyMem
  584.     
  585.     moveq    #1,d0
  586. .Err:    
  587.     movem.l    (sp)+,d2-d7/a0-a6
  588.     rts
  589.  
  590. ;------------------------------------------------------------------------
  591. ; shared things
  592.  
  593. HunkReloc32        =    1004 ;$3ec
  594. HunkCode        =    1001 ;$3e9
  595. HunkData        =    1002 ;$3ea
  596. HunkBss            =    1003 ;$3eb
  597. HunkSymbol        =    1008 ;$3f0
  598. HunkDebug        =    1009 ;$3f1
  599. HunkEnd            =    1010 ;$3f2
  600. HunkHeader        =    1011 ;$3f3
  601. HunkReloc32Short    =    1015 ;$3f7
  602.  
  603. ;Copied from my original FileShield
  604.  
  605. RemapHeader:
  606.     move.l    a1,a3        ;File addy
  607.     
  608.     move.l    a3,a4
  609.     subq.l    #1,8(a3)
  610.     subq.l    #1,16(a3)
  611.  
  612.     move.l    16(a3),20(a3)
  613.     move.l    12(a3),16(a3)
  614.     move.l    8(a3),12(a3)
  615.     move.l    4(a3),8(a3)
  616.     move.l    (a3),4(a3)
  617.  
  618. .lop:
  619.     cmp.l    #HunkCode,(a4)+
  620.     bne.b    .lop
  621.     rts
  622.  
  623. HunkCor:
  624.     move.l    a5,a6
  625.     subq.l    #4,a4
  626.  
  627. .lop2:
  628.     move.l    -(a4),-(a5)
  629.     cmpa.l    a3,a4
  630.     bne.b    .lop2
  631.     move.l    -(a3),-(a5)
  632.     move.l    -(a3),-(a5)
  633.  
  634.     move.l    a6,a4
  635.  
  636.     subq.l    #4,a4
  637. .Recalc:
  638.     addq.l    #4,a4
  639. .RecLoop:
  640.     move.l    (a4)+,d6
  641.  
  642.     cmp.w    #HunkReloc32,d6
  643.     bne.b    .Next
  644. .loop    move.l    (a4)+,d6
  645.     beq.b    .RecLoop
  646.     subq.l    #1,(a4)+
  647.     lsl.l    #2,d6
  648.     add.l    d6,a4
  649.     bra.b    .loop
  650. .Next:
  651.  
  652.     cmp.w    #HunkReloc32Short,d6
  653.     bne.b    .NextToShort
  654. .loop2    
  655.     moveq    #0,d6
  656.     move.w    (a4)+,d6
  657.     tst.l    d6
  658.     beq.b    .RecLoop
  659.     
  660.     subq.w    #$1,(a4)+
  661.     lsl.l    #1,d6
  662.     add.l    d6,a4
  663.     bra.b    .loop2
  664. .NextToShort:
  665.  
  666.     cmp.w    #HunkCode,d6
  667.     beq.b    .CodeDataDebug
  668.  
  669.     cmp.w    #HunkData,d6
  670.     beq.b    .CodeDataDebug
  671.  
  672.     cmp.w    #HunkBss,d6
  673.     beq.b    .Recalc
  674.  
  675.     cmp.w    #HunkSymbol,d6
  676.     bne.b    .Next2
  677. .loop3:
  678.     move.l    (a4)+,d6
  679.     beq.b    .RecLoop
  680.     addq.l    #1,d6
  681.     lsl.l    #2,d6
  682.     add.l    d6,a4
  683.     bra.b    .loop3
  684.     
  685. .Next2:
  686.     cmp.w    #HunkDebug,d6
  687.     beq.b    .CodeDataDebug
  688.  
  689.     cmp.w    #HunkEnd,d6
  690.     beq.b    .RecLoop
  691.  
  692.     movem.l    (sp)+,d1-a6
  693.     rts
  694.  
  695. .CodeDataDebug:    
  696.     move.l    (a4)+,d6
  697.     lsl.l    #2,d6
  698.     add.l    d6,a4
  699.     bra.b    .RecLoop
  700.